/*
* Copyright (C) 2019 ~ 2022 Uniontech Software Technology Co.,Ltd.
*
* Author:     yanghongwei <yanghongwei@uniontech.com>
*
* Maintainer: yanghongwei <yanghongwei@uniontech.com>
*/

#ifndef ABSTRACT_NOTIFY_H
#define ABSTRACT_NOTIFY_H

#include "common.h"

#include <string>
#include <thread>
#include <functional>
#include <map>

class AbstractNotifyProcess;
/**
 * @brief 这个类是一个虚基类，由INotify和FaNotify继承实现
 */
class AbstractNotify
{
public:
    // 事件通知回调函数
    typedef std::function<bool(uint64_t opTime, std::string file, std::string process, uint32_t events)> NotifyCallBackFun;

    AbstractNotify();
    virtual ~AbstractNotify();

    virtual bool init() = 0; // fanotify和inotify的具体初始化
    virtual bool addNode(const NotifyNode &node) = 0; // 添加一个要监听的节点
    virtual bool removeNode(const NotifyNode &node) = 0; // 移除一个已经监听的节点
    virtual bool start(); // 启动监听线程
    virtual bool stop() = 0; // 停止监听线程
    void setNotifyCbFun(const NotifyCallBackFun &fun, AbstractNotifyProcess *object); // 设置监听事件回调函数
    void unSetNotifyCbFun(AbstractNotifyProcess *object); // 取消监听事件回调函数
    virtual void run() = 0; // 线程执行体
    virtual bool isRunning() = 0; // 线程是否在运行

public:
    std::map<AbstractNotifyProcess *, NotifyCallBackFun> mapCallbackFuns; // 缓存所有回调<回调对象，回调函数>
};

#endif //ABSTRACT_NOTIFY_H
